﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using WebArchivosTelefonica.Jerarquias;
using System.Collections.Generic;
using System.Web.Profile;

namespace WebArchivosTelefonica
{
    /// <summary>
    /// Control para editar roles a usuarios
    /// </summary>
    public partial class ControlEditarRolUsuario : System.Web.UI.UserControl
    {
        /// <summary>
        /// Page load del control
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            AdministradorProyectos adminProyectos = new AdministradorProyectos(new FabricaLinqDataSource(), new EntidadLinqDataContext());
            if (!this.Page.IsPostBack)
            {

                //Se almacenan el nombre del usuario para poderlo retomar en el procesamiento 
                //de la información de la página.
                ViewState["usuarioNombre"] = Page.Request.Params.Get("usuarioNombre");
                string usuarioNombre = Page.Request.Params.Get("usuarioNombre");


                MembershipUser user = Membership.GetUser(usuarioNombre);

                //Se cargan los datos de usuario en el formulario. 
                LabelNombre.Text = user.UserName;
                TextBoxCorreo.Text = user.Email;


                //Se llenan los checkbox y radio lists con los valores requeridos

                //Roles generales se limita a los roles de administrador y creador
                _checkBoxListRolesGenerales.Items.Add(new ListItem("Administrador"));
                _checkBoxListRolesGenerales.Items.Add(new ListItem("Creador"));

                //Rol de tipo usuario se refiere a si es un cliente o de ingenieria
                _radioButtonListTipoUsuario.Items.Add(new ListItem("Ingenieria"));
                _radioButtonListTipoUsuario.Items.Add(new ListItem("Cliente"));


                //Listado de clientes completo

                LinqDataSourceAdp adaptadorDataSourceClientes = new LinqDataSourceAdp();
                adaptadorDataSourceClientes = (LinqDataSourceAdp)adminProyectos.GetDataSourceClientes();
                LinqDataSource _linqDataSourceClientes;
                _linqDataSourceClientes = adaptadorDataSourceClientes.GetLinqDataSource();

                _radioButtonListClientes.DataSource = _linqDataSourceClientes;

                _radioButtonListClientes.DataTextField = "Nombre";
                _radioButtonListClientes.DataValueField = "Id";
                _radioButtonListClientes.DataBind();


                //preseleccionar en el checkbox de roles generales dependiendo de los roles

                string[] rolesUsuario = Roles.GetRolesForUser(usuarioNombre);


                //Si tiene el rol administrador
                _checkBoxListRolesGenerales.Items[0].Selected = rolesUsuario.Contains("Administrador");

                //Si tiene el rol creador
                _checkBoxListRolesGenerales.Items[1].Selected = rolesUsuario.Contains("Creador");


                //preseleccionar en el checkbox de tipo usuario dependiendo de la propiedad

                //se carga el perfil del usuario
                ProfileBase usuarioProfile = ProfileBase.Create(usuarioNombre);

                //se carga la propiedad tipo usuario
                string tipoUsuario = (string)usuarioProfile.GetPropertyValue("TipoUsuario");

                //se evalua la propiedad
                _radioButtonListTipoUsuario.Items[0].Selected = tipoUsuario == "Ingenieria";

                //preseleccionar en el checkbox de clientes dependiendo de los roles, el rol
                //tiene el nombre del cliente despues de '_'
                if (!string.IsNullOrEmpty(tipoUsuario))
                {
                    if (tipoUsuario.StartsWith("Cliente_"))
                    {
                        ListItem itemClienteRol = _radioButtonListClientes.Items.FindByValue((tipoUsuario.Split(new char[1] { '_' }))[1]);
                        if (itemClienteRol != null)
                        {
                            //radiobutton de cliente
                            _radioButtonListTipoUsuario.Items[1].Selected = true;
                            itemClienteRol.Selected = true;
                        }
                    }
                }

                //despues de preseleccionar los checkbox y radio button de clientes se llenan los relacionados
                //con proyectos

                //se carga el checkboxlist de proyectos dependiendo del cliente seleccionado

                Guid guidCliente = Guid.Empty;

                //si no se selecciono ningun cliente el guid seria empty y no mostraría proyectos
                if (_radioButtonListClientes.SelectedItem != null)
                    guidCliente = new Guid(_radioButtonListClientes.SelectedValue);

                LinqDataSourceAdp adaptadorDataSourceProyectos = new LinqDataSourceAdp();
                adaptadorDataSourceProyectos = (LinqDataSourceAdp)adminProyectos.GetDataSourceProyectos(guidCliente);
                LinqDataSource _linqDataSourceProyectos;
                _linqDataSourceProyectos = adaptadorDataSourceProyectos.GetLinqDataSource();

                //se cargaran ambos el radiobuttonlist y el checkbox list
                _checkBoxListProyectos.DataSource = _linqDataSourceProyectos;
                _checkBoxListProyectos.DataTextField = "Nombre";
                _checkBoxListProyectos.DataValueField = "Id";
                _checkBoxListProyectos.DataBind();

                _radioButtonListProyectos.DataSource = _linqDataSourceProyectos;
                _radioButtonListProyectos.DataTextField = "Nombre";
                _radioButtonListProyectos.DataValueField = "Id";
                _radioButtonListProyectos.DataBind();





                //se seleccionan todos los roles que tengan tres substrings partiendolos por '_'. Según
                //la convención establecida estos roles solo pueden ser los roles de proyecto.
                //NOTA: si la convención cambia por alguna razón esta parte del código también debe modificarse
                List<string> rolesProyectos = rolesUsuario.ToList().FindAll(x => x.Split(new char[1] { '_' }).Length == 3);
                //en preseleccion se debe llenar la variable de listadoProyectosSeleccionados
                Dictionary<string, string> listadoProyectosSeleccionados = new Dictionary<string, string>();
                foreach (string rolProyecto in rolesProyectos)
                {
                    string idClienteRolProyecto = rolProyecto.Split(new char[1] { '_' })[1];
                    string idProyectoRolProyecto = rolProyecto.Split(new char[1] { '_' })[2];

                    if (_radioButtonListClientes.SelectedItem != null && idClienteRolProyecto == _radioButtonListClientes.SelectedItem.Value)
                        _checkBoxListProyectos.Items.FindByValue(idProyectoRolProyecto).Selected = true;

                    listadoProyectosSeleccionados.Add(idProyectoRolProyecto, idClienteRolProyecto + "_" + idProyectoRolProyecto);
                }
                ViewState["listadoProyectosSeleccionados"] = listadoProyectosSeleccionados;

                //preseleccionamos en el checkbox de carpetas de proyecto dependiendo de los roles
                //en preseleccion se debe llenar la variable de listadoCarpetasProyectosSeleccionados
                //se seleccionan todos los roles que inicien con "Rol_Carpeta"
                //NOTA: si la convención cambia por alguna razón esta parte del código también debe modificarse
                List<string> rolesCarpetas = rolesUsuario.ToList().FindAll(x => x.StartsWith("Rol_Carpeta"));
                //en preseleccion se debe llenar la variable de listadoCarpetasProyectosSeleccionados
                Dictionary<string, string> listadoCarpetasProyectosSeleccionados = new Dictionary<string, string>();
                foreach (string rolCarpeta in rolesCarpetas)
                {
                    string idClienteRolProyecto = rolCarpeta.Split(new char[1] { '_' })[2];
                    string idProyectoRolProyecto = rolCarpeta.Split(new char[1] { '_' })[3];
                    string idCarpetaRolProyecto = rolCarpeta.Split(new char[1] { '_' })[4];


                    listadoCarpetasProyectosSeleccionados.Add(idCarpetaRolProyecto, idClienteRolProyecto + "_" + idProyectoRolProyecto + "_" + idCarpetaRolProyecto);
                }
                ViewState["listadoCarpetasProyectosSeleccionados"] = listadoCarpetasProyectosSeleccionados;


                //TODO PROBAR preseleccionamos en el checkbox de estados de proyecto dependiendo de los roles
                //TODO PROBAR en preseleccion se debe llenar la variable de listadoEstadosProyectosSeleccionados
                //se seleccionan todos los roles que inicien con "Rol_Estado"
                //NOTA: si la convención cambia por alguna razón esta parte del código también debe modificarse
                List<string> rolesEstados = rolesUsuario.ToList().FindAll(x => x.StartsWith("Rol_Estado"));
                //en preseleccion se debe llenar la variable de listadoCarpetasProyectosSeleccionados
                Dictionary<string, string> listadoEstadosProyectosSeleccionados = new Dictionary<string, string>();
                foreach (string rolEstado in rolesEstados)
                {
                    string idClienteRolProyecto = rolEstado.Split(new char[1] { '_' })[2];
                    string idProyectoRolProyecto = rolEstado.Split(new char[1] { '_' })[3];
                    string idEstadoAprobadoRolProyecto = rolEstado.Split(new char[1] { '_' })[4];
                    string idEstadoRechazadoRolProyecto = rolEstado.Split(new char[1] { '_' })[5];


                    listadoEstadosProyectosSeleccionados.Add(idEstadoAprobadoRolProyecto + "_" + idEstadoRechazadoRolProyecto, idClienteRolProyecto + "_" + idProyectoRolProyecto + "_" + idEstadoAprobadoRolProyecto + "_" + idEstadoRechazadoRolProyecto);
                }
                ViewState["listadoEstadosProyectosSeleccionados"] = listadoEstadosProyectosSeleccionados;



                //dispose
                adaptadorDataSourceClientes.Dispose();
                //				adaptadorDataSourceEstadosProyectos.Dispose();
                adaptadorDataSourceProyectos.Dispose();
                adminProyectos.Dispose();
            }
        }

        /// <summary>
        /// Método para guardar los roles editados
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BotonGuardar_Click(object sender, EventArgs e)
        {
            List<string> nombresRolesUsuario = new List<string>();
            // se carga la informacion almacenada en el viewstate.
            string usuarioNombre = (string)ViewState["usuarioNombre"];

            MembershipUser user = Membership.GetUser(usuarioNombre);

            //Se actualiza el correo de usuario
            user.Email = TextBoxCorreo.Text;

            //Se desvincula el usuario de todos los roles
            string[] rolesAsociadosUsuario = Roles.GetRolesForUser(usuarioNombre);

            foreach (string rol in rolesAsociadosUsuario)
            {
                if (Roles.IsUserInRole(usuarioNombre, rol))
                    Roles.RemoveUserFromRole(usuarioNombre, rol);
            }

            //se agregan los roles nuevos al usuario

            //se obtienen los roles del checkbox general

            //Rol admin
            if (_checkBoxListRolesGenerales.Items[0].Selected)
                nombresRolesUsuario.Add("Administrador");

            //Rol creador
            if (_checkBoxListRolesGenerales.Items[1].Selected)
                nombresRolesUsuario.Add("Creador");

            //se carga el perfil del usuario
            ProfileBase usuarioProfile = ProfileBase.Create(usuarioNombre);
            string idClienteSeleccionado = string.Empty;
            if (_radioButtonListClientes.SelectedItem != null)
            {
                idClienteSeleccionado = _radioButtonListClientes.SelectedItem.Value;
            }


            //se obtienen las propiedades del radiobutton tipo usuario

            if ((_radioButtonListTipoUsuario == null || _radioButtonListTipoUsuario.SelectedItem == null))
            {
                _radioButtonListTipoUsuario.SelectedValue = "Ingenieria";
            }


            //propiedad tipousuario Ingenieria
            if (_radioButtonListTipoUsuario.Items[0].Selected)
                usuarioProfile.SetPropertyValue("TipoUsuario", "Ingenieria");
            else
            {
                //se revisa, si es cliente se crea el rol cliente con el cliente seleccionado

                //propiedad tipousuario Cliente

                if (_radioButtonListTipoUsuario.Items[1].Selected)
                    usuarioProfile.SetPropertyValue("TipoUsuario", "Cliente_" + idClienteSeleccionado);

            }


            //se revisa la variable listadoProyectosSeleccionados y se crean los roles respectivos
            Dictionary<string, string> listadoProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoProyectosSeleccionados"];

            if (listadoProyectosSeleccionados != null)
                foreach (KeyValuePair<string, string> itemSeleccionado in listadoProyectosSeleccionados)
                {
                    nombresRolesUsuario.Add("Rol_" + itemSeleccionado.Value);
                }



            //se revisa variable listadoCarpetasProyectosSeleccionados y se crean los roles especificos
            Dictionary<string, string> listadoCarpetasProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoCarpetasProyectosSeleccionados"];

            if (listadoCarpetasProyectosSeleccionados != null)
                foreach (KeyValuePair<string, string> itemSeleccionado in listadoCarpetasProyectosSeleccionados)
                {
                    nombresRolesUsuario.Add("Rol_Carpeta_" + itemSeleccionado.Value);
                }


            //se revisa variable listadoEstadosProyectosSeleccionados y se crean los roles especificos
            Dictionary<string, string> listadoEstadosProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoEstadosProyectosSeleccionados"];

            if (listadoEstadosProyectosSeleccionados != null)
                foreach (KeyValuePair<string, string> itemSeleccionado in listadoEstadosProyectosSeleccionados)
                {
                    nombresRolesUsuario.Add("Rol_Estado_" + itemSeleccionado.Value);
                }

            //se guardan los roles creados

            foreach (string nombreRol in nombresRolesUsuario)
            {
                if (!Roles.RoleExists(nombreRol))
                    Roles.CreateRole(nombreRol);

                Roles.AddUserToRole(usuarioNombre, nombreRol);
            }

            //se guarda el profile del usuario
            usuarioProfile.Save();
            // se actualiza el usuario
            Membership.UpdateUser(user);
            Response.Redirect("ListadoUsuarios.aspx");
        }

        /// <summary>
        /// Evento de cambio de item seleccionado para el listado de proyectos, se almacena el check
        /// que se halla realizado o en caso de que el check se deselecciona se quita del almacenamiento
        /// si se encuentra en este listado de items chequeados
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void _checkBoxListProyectos_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.Page.IsPostBack)
            {
                //se obtiene el listado de items seleccionados del viewstate
                Dictionary<string, string> listadoProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoProyectosSeleccionados"];

                //se identifica cual item fue el que cambio
                string eventTarget = Request.Form["__EVENTTARGET"];
                string checkboxIndex = eventTarget.Split(new char[1] { '$' })[2];

                //se revisa que cambio fue, si se seleccionó o no se seleccionó
                //si se selecciono se almacena en una variable list en en el viewstate
                //si no se busca que este en esta lista y se elimina si se encuentra
                string checkboxClienteId = _radioButtonListClientes.SelectedItem.Value;
                string checkboxText = _checkBoxListProyectos.Items[Int32.Parse(checkboxIndex)].Text;
                string checkboxValue = _checkBoxListProyectos.Items[Int32.Parse(checkboxIndex)].Value;


                if (_checkBoxListProyectos.Items[Int32.Parse(checkboxIndex)].Selected)
                {
                    if (listadoProyectosSeleccionados == null)
                    {
                        listadoProyectosSeleccionados = new Dictionary<string, string>();
                    }

                    listadoProyectosSeleccionados.Add(checkboxValue, checkboxClienteId + '_' + checkboxValue);
                }
                else
                {
                    KeyValuePair<string, string> valorEliminado = new KeyValuePair<string, string>(checkboxValue, checkboxClienteId + "_" + checkboxValue);
                    if (listadoProyectosSeleccionados != null && listadoProyectosSeleccionados.Contains(valorEliminado))
                    {
                        listadoProyectosSeleccionados.Remove(checkboxValue);
                    }

                }

                //se guarda el listado nuevo
                ViewState["listadoProyectosSeleccionados"] = listadoProyectosSeleccionados;

                //se deshabilita el checkbox de carpetas y el de estados si no se ha dado el rol en el checkbox
                //de proyectos
                ListItem item = _checkBoxListProyectos.Items.FindByValue(_radioButtonListProyectos.SelectedValue);
                _checkBoxListCarpetasProyecto.Enabled = item != null && item.Selected;

                //TODO: REVISAR tambien para estados
                _checkBoxListEstadosProyecto.Enabled = item != null && item.Selected;


            }
        }

        /// <summary>
        /// Evento de cambio de item seleccionado para el listado de carpetas de los proyectos, se almacena
        /// el check que se halla realizado o en caso de que el check se deselecciona se quita del
        /// almacenamiento si se encuentra en este listado de items chequeados
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void _checkBoxListCarpetasProyecto_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.Page.IsPostBack)
            {
                //se obtiene el listado de items seleccionados del viewstate
                Dictionary<string, string> listadoCarpetasProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoCarpetasProyectosSeleccionados"];

                //se identifica cual item fue el que cambio
                string eventTarget = Request.Form["__EVENTTARGET"];
                string checkboxIndex = eventTarget.Split(new char[1] { '$' })[2];

                //se revisa que cambio fue, si se seleccionó o no se seleccionó
                //si se selecciono se almacena en una variable list en en el viewstate
                //si no se busca que este en esta lista y se elimina si se encuentra
                string checkboxClienteId = _radioButtonListClientes.SelectedItem.Value;
                string checkboxProyectoId = _radioButtonListProyectos.SelectedItem.Value;
                string checkboxText = _checkBoxListCarpetasProyecto.Items[Int32.Parse(checkboxIndex)].Text;
                string checkboxValue = _checkBoxListCarpetasProyecto.Items[Int32.Parse(checkboxIndex)].Value;


                if (_checkBoxListCarpetasProyecto.Items[Int32.Parse(checkboxIndex)].Selected)
                {
                    if (listadoCarpetasProyectosSeleccionados == null)
                    {
                        listadoCarpetasProyectosSeleccionados = new Dictionary<string, string>();
                    }

                    listadoCarpetasProyectosSeleccionados.Add(checkboxValue, checkboxClienteId + '_' + checkboxProyectoId + '_' + checkboxValue);
                }
                else
                {
                    KeyValuePair<string, string> valorEliminado = new KeyValuePair<string, string>(checkboxValue, checkboxClienteId + '_' + checkboxProyectoId + '_' + checkboxValue);
                    if (listadoCarpetasProyectosSeleccionados != null && listadoCarpetasProyectosSeleccionados.Contains(valorEliminado))
                    {
                        listadoCarpetasProyectosSeleccionados.Remove(checkboxValue);
                    }

                }

                //se guarda el listado nuevo
                ViewState["listadoCarpetasProyectosSeleccionados"] = listadoCarpetasProyectosSeleccionados;
            }
        }

        /// <summary>
        /// Evento de cambio de item seleccionado para el listado de estados de los proyectos, se almacena
        /// el check que se halla realizado o en caso de que el check se deselecciona se quita del
        /// almacenamiento si se encuentra en este listado de items chequeados
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void _checkBoxListEstadosProyecto_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.Page.IsPostBack)
            {
                //se obtiene el listado de items seleccionados del viewstate
                Dictionary<string, string> listadoEstadosProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoEstadosProyectosSeleccionados"];

                //se identifica cual item fue el que cambio
                string eventTarget = Request.Form["__EVENTTARGET"];
                string checkboxIndex = eventTarget.Split(new char[1] { '$' })[2];

                //se revisa que cambio fue, si se seleccionó o no se seleccionó
                //si se selecciono se almacena en una variable list en en el viewstate
                //si no se busca que este en esta lista y se elimina si se encuentra
                string checkboxClienteId = _radioButtonListClientes.SelectedItem.Value;
                string checkboxProyectoId = _radioButtonListProyectos.SelectedItem.Value;
                string checkboxText = _checkBoxListEstadosProyecto.Items[Int32.Parse(checkboxIndex)].Text;
                string checkboxValue = _checkBoxListEstadosProyecto.Items[Int32.Parse(checkboxIndex)].Value;


                if (_checkBoxListEstadosProyecto.Items[Int32.Parse(checkboxIndex)].Selected)
                {
                    if (listadoEstadosProyectosSeleccionados == null)
                    {
                        listadoEstadosProyectosSeleccionados = new Dictionary<string, string>();
                    }

                    listadoEstadosProyectosSeleccionados.Add(checkboxValue, checkboxClienteId + '_' + checkboxProyectoId + '_' + checkboxValue);
                }
                else
                {
                    KeyValuePair<string, string> valorEliminado = new KeyValuePair<string, string>(checkboxValue, checkboxClienteId + '_' + checkboxProyectoId + '_' + checkboxValue);
                    if (listadoEstadosProyectosSeleccionados != null && listadoEstadosProyectosSeleccionados.Contains(valorEliminado))
                    {
                        listadoEstadosProyectosSeleccionados.Remove(checkboxValue);
                    }

                }

                //se guarda el listado nuevo
                ViewState["listadoEstadosProyectosSeleccionados"] = listadoEstadosProyectosSeleccionados;
            }
        }

        /// <summary>
        /// Evento de cambio de item seleccionado para el listado de clientes, se usa para recargar el
        /// checkbox de proyectos si se cambio el cliente, y resetear el listado de proyectos seleccionados
        /// si se esta creando un rol Cliente
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void _radioButtonListClientes_SelectedIndexChanged(object sender, EventArgs e)
        {

            AdministradorProyectos adminProyectos = new AdministradorProyectos(new FabricaLinqDataSource(), new EntidadLinqDataContext());

            Guid guidCliente = Guid.Empty;

            guidCliente = new Guid(_radioButtonListClientes.SelectedValue);

            LinqDataSourceAdp adaptadorDataSourceProyectos = new LinqDataSourceAdp();
            adaptadorDataSourceProyectos = (LinqDataSourceAdp)adminProyectos.GetDataSourceProyectos(guidCliente);
            LinqDataSource _linqDataSourceProyectos;
            _linqDataSourceProyectos = adaptadorDataSourceProyectos.GetLinqDataSource();

            _checkBoxListProyectos.DataSource = _linqDataSourceProyectos;

            _checkBoxListProyectos.DataTextField = "Nombre";
            _checkBoxListProyectos.DataValueField = "Id";
            _checkBoxListProyectos.DataBind();

            _radioButtonListProyectos.DataSource = _linqDataSourceProyectos;

            _radioButtonListProyectos.DataTextField = "Nombre";
            _radioButtonListProyectos.DataValueField = "Id";
            _radioButtonListProyectos.DataBind();


            adaptadorDataSourceProyectos.Dispose();
            adminProyectos.Dispose();


            //preseleccionar en el checkbox de proyectos dependiendo de variable
            Dictionary<string, string> listadoProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoProyectosSeleccionados"];
            if (listadoProyectosSeleccionados != null)
                foreach (KeyValuePair<string, string> itemSeleccionado in listadoProyectosSeleccionados)
                {
                    ListItem itemCheck = _checkBoxListProyectos.Items.FindByValue(itemSeleccionado.Key);

                    if (itemCheck != null)
                        itemCheck.Selected = true;
                }

            //si esta seleccionado el rol de cliente para tipo de usuario debe reiniciar la lista de items
            //de proyecto seleccionados
            if (_radioButtonListTipoUsuario.SelectedIndex == 1)
            {
                ViewState["listadoProyectosSeleccionados"] = new Dictionary<string, string>();
                //Igual para la lista de carpetas
                ViewState["listadoCarpetasProyectosSeleccionados"] = new Dictionary<string, string>();
                //TODO PROBAR Igual para lista de Estados
                ViewState["listadoEstadosProyectosSeleccionados"] = new Dictionary<string, string>();
            }


            //Realizar binding del listado de carpetas para que se resetee
            _hiddenFieldIdProyectoSeleccionado.Value = string.Empty;
            _checkBoxListCarpetasProyecto.DataBind();
        }

        /// <summary>
        /// Evento de cambio de item seleccionado para el listado de proyectos, se usa para recargar los
        /// checkbox de carpetas y estados de proyectos relacionados
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void _radioButtonListProyectos_SelectedIndexChanged(object sender, EventArgs e)
        {
            Administrador admin = new Administrador(new FabricaLinqDataSource(), new EntidadLinqDataContext());
            //recargar checkbox de carpetas
            string nombreCarpetaBase = "CarpetaBase_" + _radioButtonListClientes.SelectedValue + "_" + _radioButtonListProyectos.SelectedValue;
            //ViewState["nombreCarpetaBase"] = nombreCarpetaBase;
            //el nombre debe ser unico por lo que se busca el id del nombre que se esta buscando
            Guid idCarpetaBase = admin.GetIdCarpetaByName(nombreCarpetaBase);
            //ViewState["idCarpetaBase"] = idCarpetaBase.ToString();
            //binding de carpetas
            _hiddenFieldIdProyectoSeleccionado.Value = idCarpetaBase.ToString();
            _checkBoxListCarpetasProyecto.DataBind();

            //TODO: PROBAR binding de estados 
            List<InfoEstadosDocumentosProyecto> estadosProyectoSeleccionado = admin.GetDataSourceEstadosDocumentosProyecto(_radioButtonListProyectos.SelectedValue);

            //se limpia el checkbox primero
            _checkBoxListEstadosProyecto.Items.Clear();
            foreach (InfoEstadosDocumentosProyecto infoEstado in estadosProyectoSeleccionado)
            {
                _checkBoxListEstadosProyecto.Items.Add(new ListItem(infoEstado.NombreEstadoAprobado + " / " + infoEstado.NombreEstadoRechazado, infoEstado.IdEstadoAprobado + "_" + infoEstado.IdEstadoRechazado));
            }

            //preseleccionar en el checkbox de carpetas dependiendo de variable
            Dictionary<string, string> listadoCarpetasProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoCarpetasProyectosSeleccionados"];
            if (listadoCarpetasProyectosSeleccionados != null)
                foreach (KeyValuePair<string, string> itemSeleccionado in listadoCarpetasProyectosSeleccionados)
                {
                    ListItem itemCheck = _checkBoxListCarpetasProyecto.Items.FindByValue(itemSeleccionado.Key);

                    if (itemCheck != null)
                        itemCheck.Selected = true;
                }

            //TODO: PROBAR preseleccionar en checkbox de estados
            Dictionary<string, string> listadoEstadosProyectosSeleccionados = (Dictionary<string, string>)ViewState["listadoEstadosProyectosSeleccionados"];
            if (listadoEstadosProyectosSeleccionados != null)
                foreach (KeyValuePair<string, string> itemSeleccionado in listadoEstadosProyectosSeleccionados)
                {
                    ListItem itemCheck = _checkBoxListEstadosProyecto.Items.FindByValue(itemSeleccionado.Key);

                    if (itemCheck != null)
                        itemCheck.Selected = true;
                }



            //se deshabilita el checkbox de carpetas y el de estados si no se ha dado el rol en el checkbox
            //de proyectos
            ListItem item = _checkBoxListProyectos.Items.FindByValue(_radioButtonListProyectos.SelectedValue);
            _checkBoxListCarpetasProyecto.Enabled = item != null && item.Selected;

            //TODO: tambien para estados
            _checkBoxListEstadosProyecto.Enabled = item != null && item.Selected;

            admin.Dispose();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void _radioButtonListProyectos_DataBound(object sender, EventArgs e)
        {
            foreach (ListItem item in _radioButtonListProyectos.Items)
                item.Text = string.Empty;
        }
    }
}